﻿using GalFrameWork.Models;
using SQLite;

namespace GalFrameWork.Services.Impl;

public class DialogStorage : IDialogStorage
{
    //数据库文件的名字
    //const代表常量，永远都不会变
    public const string DbFileName = "Dialogdb.sqlite3";

    //找到文件的路径，只读static字符串
    //1.Environment关键字：与操作系统相关，Environment.SpecialFolder.LocalApplicationData一定可以安全读写的位置——跨平台机制
    //2. Environment.GetFolderPath得到文件地址的位置
    //3.文件路径拼接——跨平台开发，自动拼接匹配： Path.Combine()
    //跨平台开发思想

    //static readonly：static表示是类的一部分，不是实例的一部分，也就是只能有一个PoetryDbPath
    public static readonly string PoetryDbPath =
        Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder
                .LocalApplicationData), DbFileName);

    private SQLiteAsyncConnection _connection;

    //打开数据库连接，不需要数据库连接字符串，只需要一个连接路径即可
    public SQLiteAsyncConnection Connection =>
        _connection ??= new SQLiteAsyncConnection(PoetryDbPath);

    public async Task AddDialog(MyDialog dialog)
    {
        await Connection.InsertAsync(dialog);
    }

    public async Task<IEnumerable<MyDialog>> GetDialogs()
    {
        return await Connection.Table<MyDialog>().ToListAsync();
    }

    public async Task Initialize()
    {
        //创建数据库，传入想创建的表Poetry
        //1.Async结尾函数：异步机制的函数,前面必须用await关键字修饰
        // 函数的返回值必须是Task，且用async修饰
        await Connection.CreateTableAsync<MyDialog>();
    }

    public async Task DeleteDialog(MyDialog dialog)
    {
        await Connection.DeleteAsync(dialog);
    }

    //批量导入（从Excel导入）
    public async Task ImportDialogs(IEnumerable<MyDialog> dialogs)
    {
        await Connection.InsertAllAsync(dialogs);
    }

}